مقدمات زبانc
زبان C در سال 1970 توسط دنيس ريچي طراحي گرديد. اين زبان تكامل يافته زبان BCPL
ميباشد كه طراح آن مارتين ريچاردز است ،و زبان BCP از زبان B كه طراح آن
كن تامپسون مي باشد ، نتيجه شده است .
زبان C معمولا" يك زبان مياني ناميده مي شود . اين بدان معني نيست كه آموزش
اين زبان مشكل است ، يا قدرت آن از زبان هاي برنامه سازي مثل پاسكال و بيسيك
كمتر است و يا اين كه مشكلاتي مشابه زبان اسمبلي براي برنامه نويس ايجاد مي كند.
علت مياني بودن زبان C اين است كه عناصر زبان هاي سطح بالا را با خصيصه تابعي
زبان اسمبلي درهم آميخته است
زبان C همانند ساير زبانهاي مياني با مفاهيم بيت ، بايت و آدرس كه از عناصر
ابتدايي ماشين هستند سر و كار دارد . يعني در اين زبان مي توان محتويات بيت ها
و بايت ها را تيز تغيير داد .
برنامه هاي نوشته شده به زبان C براحتي از ماشيني به ماشين ديگر قابل انتقال
مي باشند . مثلا" برنامه نوشته شده براي كامپيوتر APPL در كامپيوترهاي IBM قابل
اجرا است . اين خصيصه را قابل حمل بودن (Portability) زبان مي گويند .
كليه زبان هاي برنامه سازي سطح بالا و مياني داراي نوعهاي داده (data types)
هستند . هر نوع داده ، مجموعه اي از مقادير را مشخص مي كند كه اعمال خاصي روي
آنها قابل انجام است . نوع داده اي كه در اكثر زبانها وجود دارد عبارتند از :
اعداد صحيح ، كاراكتري و اعداد اعشاري . C داراي 5 نوع داده اصلي است كه در آن
تقريبا" تبديل هر نوع داده به نوع ديگر امكان پذير است . مثلا" در يك عبارت
مي توان نوع كاراكتري را با نوع عددي صحيح و يا اعشاري تركيب كرد .
زبان C خطاي زمان اجرا مثل boundray checking را چك نمي كند . منظور از boundray
checkingاين است كه در آرايه ها تجاوز از حدود مشخص شده ، به راحتي
امكان پذير بوده و از نظر كامپايلر با خطايي مواجه نميشود. اين مساله برميگردد
به اين كه در زبان C آرايهيك اشاره گر (pointer) است . در اين راستا ، نوع
پارامترها و آرگومان هاي توابع نيز در گونه هاي قديمي C با يكديگر مطابقت نشده و
از نظر كامپايلر با خطا مواجه نمي شد ولي در گونه هاي جديد C با معرفي الگوي
تابع (Function prototype) اين مشكل رفع شده است . Cهمانند زبان هاي ALGOL، PASCAl، و... يك زبان ساخت يافته است . يك زبان
برنامه سازي ساخت يافته امكانات زيادي ، از جمله استفاده از چند ساختار حلقه سازي
مثل while، do-while،و forو را فراهم مي كند . در اين گونه زبان ها از goto به
ندرت استفاده مي شود و نوشتن دستورات برنامه در هر ستوني از خط و در هر جاي
فايل امكان پذير بوده ، مثل زبان فرترن مقيد به ستون هاي خاصي نيستند. استفاده
از زيربرنامه ها و بلاك ها نيز از خصيصه هاي اين نوع زبان ها هستند . ذكر اسامي
چند زبان ساخت يافته و غير ساخت يافته ، در انتخاب زبان برنامه سازي جهت برنامه
نويسي مفيد است . بعضي از زبانهاي ساخت يافته و غيرساخت يافته
هر برنامه در زبان C داراي خصيصه هايي است كه بعضي از آنها عبارتند از :
1در زبان C هر دستور برنامه به يك ; ختم مي شود .
2هر دستور ميتواند درچند خط ادامه داشته و يك خط ممكن است شامل چند دستور
باشد .
3حداكثر طول يك خط برنامه 254 كاراكتر است .
4در زبان C برنامه نويس مي تواند در هر نقطه از برنامه ، بااستفاده از علائم {و }و يك بلاك را مشخص كرده و هر متغيري را كه مي خواهد در آنجا تعريف نمايد .
اين متغيرها فقط در آن بلاك معني خواهند داشت . توجه داريم كه هر بلاك مجموعه اي
از دستورات وابسته به يكديگر خواهد بود :
ؤؤ { |
بلاك | ; مجموعه دستورات } |
ؤؤ 5
براي داشتن توضيحات در برنامه كافي است آنها را دربين /*و *و/ قرار داد: *
توضيحات /* C
يك زبان ساخت يافته بلاكي نيست . اين بدان معني است كه تعريف يك زيربرنامه
( در اينجا تابع ) در زيربرنامه ديگر ( همانند پاسكال ) امكان پذير نيست و اين
امر از مساله coupling مي كاهد . Cزبان برنامه نويسي سيستم است . منظور از برنامه هاي سيستم عبارتند از : 1
سيستم عامل (Operating system) 2
مفسر (Interpreter) 3
ويراستار (Editor) 4
اسمبلر (Assrmbler) 5
كامپايلر (Compiler) 6
مديريت بانكهاي اطلاعاتي (Database management)
امروزه C در اكثر امور برنامه نويسي مورد استفاده قرار مي گيرد . زيرا اين
زبان هم داراي خصيصه " قابل حمل بودن " است و هم داراي كارآيي خوبي مي باشد و
سرعت زياد C بر محبوبيت آن افزوده است . مساله قابل حمل بودن ، يك مساله بسيار
مهم است زيرا هم موجب صرفه جويي در وقت شده و هم باعث صرفه جويي در هزينه ها
مي گردد .
زبان C فقط داراي 32 كلمه كليدي است ( جدول (3) ) كه 27 كلمه كليدي آن توسط
ريچي ( طراح زبان ) معرفي شده و 5 كلمه كليدي ديگر توسط موسسه استاندارد سازي
زبان به آن اضافه شده است . اين تعداد در مقايسه با 159 كلمه كليدي كه در زبان
بيسيك وجود دارد قابل توجه است .
انواع داده
همان طور كه قبلا" گفته شد در هر زبان برنامه سازي تعدادي از نوع هاي داده
وجود دارند كه بازه اي را شامل بوده و اعمال خاصي روي آنها انجام پذير است و در Cپنج نوع داده اصلي وجود دارد كه عبارتند از : char، int،، float،، double، و void. در اين زبان اندازه و محدوده اي كه هر نوع داده اختيار مي كند بستگي به
نوع پردازشگر (Processor) و نحوه پياده سازي كامپايلر دارد. شناسه هايي ( متغير
برچسب ، اسامي توابع و ... ) كه ازنوع char باشند براي ذخيره كردن مقاديري كه
توسط كاراكترهاي اسكي تعريف شده اند به كار مي روند. شناسه هايي از نوع int براي
ذخيره كردن مقادير صحيح ، و از نوع floatو doubleو براي ذخيره كردن اطلاعات عددي
اعشاري به كار ميروند كه محدوده آنها توسط تعداد ارقام و دقت آنها مشخص ميشود.
نوع void در مورد توباع به كار مي رود .
تعريف نوع متغير
براي استفاده از متغيرها درC بايد ابتدا آنها را تعريف كنيم . تعريف متغيرها
شامل نامگذاري و تعيين نوع آنها است كه به صورت زير انجام مي شود
<نوع> <اسامي متغيرها>
يكي از انواع است كه قبلا<نوع>" شامل متغيرهايي <اسامي متغيرها> ذكر كرديم و
است كه مي خواهيم داراي آن نوع باشند . براي تعريف چند متغير در يك
دستور بايد
اسامي با كاما از يكديگر جدا گردد : int var1/ var2
دستور فوق دو متغير به اسامي var2و var1و را از نوع int تعريف مي كند . float
flovar1/ flovar2;
دستور فوق ، دو متغير به نام هاي flovar2و flovar1و را از نوع float تعريف
مي كند . double d1;
char ch;
اولين دستور ، d1 را از نوع double و دستور دوم متغير ch را از نوع char
تعريف مي كند .
مقدار دادن به متغيرها
براي مقدار دادن به متغيرها مي توان به دو طريق عمل كرد: 1 به هنگام تعريف
متغير . 2 پس از تعريف متغير . به عنوان مثال : int a=0;
int b/ c/ d/ e=0;
char ch= 'a';
تابع
()printf
اين تابع براي انتقال اطلاعات از كامپيوتر به صفحه نمايش مورد
استفاده قرار
مي گيرد و بصورت زير استفاده مي شود : ;
( عبارت ديگر " / عبارت " 1) printf) "
عبارت " 1 شامل تعدادي كاراكترهاي كنترلي ، كاراكترهاي قالب
جهت تعيين شكل
خروجي و رشته هاي ديگري است كه بايد به خروجي منتقل شوند . "
عبارت ديگر " شامل
اطلاعاتي هستند كه با فرمت مشخص شده در " عبارت " 1، بايد به
خروجي منتقل شوند.
كاراكترهايي كه براي تعيين فرمت خروجي مورد استفاده قرار مي
گيرند با كاراكتر %
شروع مي شوند ( جدول 1 ) .
كاراكتر | نوع اطلاعات كه بايد به خروجي منتقل شود |
%C | % يك كاراكتر | |
%d | % اعداد صحيح دهدهي مثبت و منفي | |
%i | % اعداد صحيح دهدهي مثبت و منفي | |
%e | % نمايش علمي عدد همراه با حرف e | |
%E | % نمايش علمي عدد همراه با حرف E | |
%f | % عدد اعشاري مميز شناور | |
%g | % اعداد اعشاري مميز شناور | |
%G | % اعداد اعشاري مميز شناور | |
%O | % اعداد مبناي 8 مثبت | |
%S | % رشته اي از كاراكترها ( عبارت رشته اي ) | |
%U | % اعداد صحيح بدون علامت ( مثبت ) | |
%x | % اعداد مبناي 16 مثبت با حروف كوچك | |
%X | % اعداد مبناي 16 مثبت با حروف بزرگ | |
%p pointer | % ( اشاره گر ) | |
%n | % موجب ميشود تا تعداد كاراكترهايي كه تا قبل | |
| ازاين كاراكتر به خروجي منتقل شده اند شمارش | |
| شده و در پارامتر متناظر با آن قرار گيرد . | |
%% | % علامت % |
جدول (1) . كاراكترهاي فرمت در تابع ()printf
كاراكترهاي كنترلي كه در تابع ()printf بكار ميروند در جدول
(2) آمده است .
بعضي از كاراكترهاي كنترلي براي انتقال خروجي به يك محل معين
از صفحه نمايش
مورد استفاده قرار مي گيرند .
| كاراكتر عملي كه انجام مي شود |
\f | \ موجب انتقال كنترل به صفحه جديد مي شود | |
\n | \ موجب انتقال كنترل به خط جديد مي شود | |
\t | \ انتقال به 8 محل بعدي صفحه نمايش | |
\" | \ چاپ كوتيشن (") | |
\' | \ چاپ كوتيشن (') | |
\0 NULL | \ رشته تهي | | back slash | \\ |
|
\V | \ انتقال كنترل به 8 سطر بعدي | |
\N | \ ثابت هاي مبناي 8( N( عدد مبناي 8 است ) | |
\xN | \ ثابت هاي مبناي 16( N( عدد مبناي 16 است ) |
جدول (2) . كاراكترهاي كنترلي
چند دستور متوالي كه شامل تابع ()print باشند ، خروجي خود را
بر روي يك سطر
منتقل يم كنند . مگر اين كه با پارامتر كنترلي \n كنترل را به
سطر بعدي منتقل
كنيم .
مثال 1:
main)(
{
printf(" i like %c "/'c' );
printf("%s"/"very much." );
}
خروجي حاصل از اجراي برنامه فوق بصورت ذيل خواهد بود : i like
c very much.
با استفاده از \n مي توانيم خروجي را در چند سطر داشته باشيم .
main)(
{
printf("this is second program.\n" );
printf("output is in two line." );
}
خروجي حاصل از اجراي برنامه فوق بصورت ذيل است : this is
second program.
output is in two line.
مثال 2: main)(
{
int num ;
printf("the address of num is:" );
printf(" %p"/ &num );
}
در مثال فوق عبارت &num آدرس متغير num را مشخص مي كند كه براي
نوشتن آن از
كاراكتر فرمت %p استفاده شده است . نمونه اي از خروجي مثال 2
بصورت زير است . the address of num is : 6A30:OFE4
اگر در تابع ()printf چند كاراكتر فرمت داشته باشيم ، هر
كاراكتر با يك عنصر
داده كه بايد به خروجي برود تطبيق داده مي شود : main)(
{
int a=10 ;
float b=20 ;
printf(" a is:%d/b is :%f"/a/b);
}
خروجي حاصل از اجراي برنامه فوق بصورت ذيل است : a is:10/b
is:20:000000
مثال 3: main)(
{
unsigned int num ;
num=100 ;
printf("the value of num is:%u"/num);
}
همانطوري كه در مثال 3 مشاهده مي شود ، براي چاپ عدد num كه
بصورت عدد صحيح
بدون علامت تعريف شد ، از %u استفاده شده است .
خروجي حاصل از اجراي برنامه مثال 3 به صورت ذيل است : the
value of num is:100
مثال 4: main)(
{
double d ;
d=le+007 ;
printf("the value of d is:%e\n"/d);
printf("the value of d is:%E\n"/d);
printf("the value of d is:%g\n"/d);
}
خروجي حاصل از اجراي برنامه مثال 4 بصورت ذيل خواهد بود : the
value of d is:1.00000e+07
the value of d is:1.00000E+07
the value of d is:1e+07
همانطور كه مشاهده مي شود براي چاپ اعدادي كه بصورت نماد علمي
باشند ميتوان
از كاراكترهاي فرمت % e، % E،و % gو استفاده كرد .
مثال 5: main)(
{
float f=12.50 ;
int t=10 ;
printf("\n f is:%f"/f );
printf(" tenper is:%%%d"/t );
}
خروجي حاصل از اجراي برنامه فوق بصورت زير است : f
is:12.500000/tenper is:%10
در مثال 5 براي چاپ علامت % از كاراكتر %% و براي چاپ متغير f
از نوع float
مي باشد از %f استفاده شده است .
كاراكتر فرمت %n از ساير كاراكترهاي فرمت متفاوت است . اين
كاراكتر بجاي
انتقال مقاديري به خروجي ، موجب مي شود تا تعداد كاركترهايي كه
تا قبل از اين
كاراكتر به خروجي منتقل شده اند ، شمارش شده و در پارامتر
متناظر با آن قرار
بگيرد .
مثال 6: main)(
{
printf("\neach\tword\tis\n" );
printf("tabbed\tover\tonce" );
}
خروجي از اجراي برنامه فوق بصورت زير خواهد بود : each word is
tabbed over once
كاراكتر كنترلي \b موجب انتقال مكان نما به اندازه يك كاراكتر
به عقب ميشود
( بسمت چپ ). كاراكترهاي كنترلي \ "و \و براي چاپ كوتيشن
درخروجي مورد استفاده
قرار مي گيرند .
تعيين طول ميدان در تابع ()printf
در حين انتقال اطلاعات توسط تابع ()printf ميتوانيم طول ميدان
خروجي را مشخص
كنيم . در اين مورد مي توانيم محل نقطه اعشار و تعداد ارقام
اعشار را نيز تعيين
كنيم . تعيين طول ميدان در جدول بندي ها بسيار مفيد است . طول
ميدان ، بصورت w.d
است كه در اعداد اعشاري مميز شناور ، w طول ميدان و d تعداد
ارقام اعشار را
مشخص مي كند .
مثال 7: main)(
{
printf("\n%8.1f %8.1f %8.1f\n"
/3.0/12.5/523.3 );
printf("\n%8.1f %8.1f %8.1f\n"
/300.0/1200.5/5300.3 );
}
خروجي حاصل از اجراي برنامه فوق بصورت زير است : 3.0 12.5
523.3
300.0 1200.5 5300.3
همانطوركه مشاهده مي گردد طول ميدان برابر با 8 و تعداد ارقام
اعشار، برابر
با يك كه در منتهااليه سمت راست ميدان قرار گرفته ، منظور شده
است . براي توضيح
بيشتر ، عدد 5300/3 را در حافظه نشان مي دهيم :
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | 5 | 3 | 0 | 0 | . |
3 |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
اگر فرمت w.d كه طول ميدان را مشخص مي كند در مورد رشته ها
استفاده گردد ، w
حداقل طول ميدان و d حداكثر كاراكترهاي قابل چاپ را مشخص مي
كند .
اگر w.d در مورد اعداد صحيح بكار برده شود ، w مشخص كننده
حداقل طول ميدان
و d تعيين كننده حداكثر طول ميدان است .
مثال 8: main)(
{
printf("%7.4f\n"/123.1234567 );
printf("%3.8d\n"/1000 );
printf("%10.16a\n"/"this is a" );
printf(" simple test" );
}
خروجي حاصل از اجراي برنامه فوق بصورت زير است : 123.1235
00001000
this is a simple
|